[Spring Boot] Flyway 3系で作ったテーブルを Flyway 5系にアップデートする方法
こんにちは。齋藤です。
現在僕たちのチームでは、Spring Bootを使ったアプリケーションを使っています。 僕はアップデートおじさんとして、アプリケーションで使っているライブラリのアップデートを日々行っています。
その中で使っているDBのマイグレーションのライブラリである、Flyway 今日は3分で分かる、Flywayのバージョンアップについて記事にしておきます。
はじめに
BOMを見たところ、Spring Boot 1.5.14において、テストされているflywayのバージョンは 3.2.1です。
しかし、Flywayの最新はFlyway 5.1.3です。 また、Spring Boot 2.x系の最新である、2.0.3では5.0.7が使われています。
試しにSpring Bootを2系にしてバージョンアップしたところマイグレーションをしたところ DBのマイグレーションが失敗しました。
今回はこのFlyway 3.2.1とSpring Bootで作ったアプリケーションにおいて Flywayのバージョンアップをどうするかについて説明します。
方法
今回の方法は非常に簡単です。
- Flywayのバージョンをひとまず、4.2.0にアップデートして、マイグレーションを実行する
- Spring Bootのapplication.propertiesにFlywayの設定を追加する
- Flywayのバージョンを5.1.3にアップデートする
Flywayのバージョンアップが出来たら Spring Bootのアップデートも出来そうやなガッハッハ!! というわけで、アップデートしていきます。
前提条件
参考に実際やってみた環境条件を示しておきます。
$ java -version java version "1.8.0_161" Java(TM) SE Runtime Environment (build 1.8.0_161-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode) $ mysql --version mysql Ver 14.14 Distrib 5.7.20, for osx10.13 (x86_64) using EditLine wrapper $ ./gradlew bootRun ------------------------------------------------------------ Gradle 4.6 ------------------------------------------------------------ Build time: 2018-02-28 13:36:36 UTC Revision: 8fa6ce7945b640e6168488e4417f9bb96e4ab46c Groovy: 2.4.12 Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017 JVM: 1.8.0_161 (Oracle Corporation 25.161-b12) OS: Mac OS X 10.13.5 x86_64
Spring Bootのバージョンは 1.5.10.RELEASE を使いました。
やってみる
それではやってみましょう。今回はgradle bootRunで試しました。
まずは mysqlの設定周りをよしなにしてから gradle bootRunでアップデートを試します。
まずは起動してマイグレーションを走らせます。
走らせました。
$ gradle bootRun # ひとまず、3系のアプリケーションを起動してみる。 ... 2018-06-29 18:38:59.001 INFO 48666 --- [ restartedMain] c.g.wreulicke.simple.SimpleApplication : Started SimpleApplication in 14.732 seconds (JVM running for 15.473)
Databaseのマイグレーションが実行されていることでしょう。
Flyway 4系にあげてみる
Flywayのバージョンを4系に上げて起動してみましょう。 ここでは4.2.0にしてみます。
おや・・・?
$ gradle bootRun 2018-06-29 20:11:16.005 INFO 62409 --- [ost-startStop-1] o.f.c.i.metadatatable.MetaDataTableImpl : Upgrading metadata table `test`.`schema_version` to the Flyway 4.0 format ... 2018-06-29 20:11:16.275 INFO 62409 --- [ost-startStop-1] o.f.c.i.metadatatable.MetaDataTableImpl : Repairing metadata for version 1 (Description: create initial tables, Checksum: -523004839) ... 2018-06-29 20:11:16.276 INFO 62409 --- [ost-startStop-1] o.f.c.i.metadatatable.MetaDataTableImpl : Repairing metadata for version 2 (Description: create products, Checksum: 2082022939) ... 2018-06-29 20:11:16.278 INFO 62409 --- [ost-startStop-1] o.f.c.i.metadatatable.MetaDataTableImpl : Repairing metadata for version 3 (Description: create social connections, Checksum: -2006730467) ... 2018-06-29 20:11:16.279 INFO 62409 --- [ost-startStop-1] org.flywaydb.core.Flyway : Metadata table schema_version successfully upgraded to the Flyway 4.0 format. ... 2018-06-29 20:11:23.327 INFO 62409 --- [ restartedMain] c.g.wreulicke.simple.SimpleApplication : Started SimpleApplication in 16.435 seconds (JVM running for 17.259)
自動でmetadataを Flyway 4系向けにアップデートしてくれそうです!!
次は 5系にあげてみる
今回は試しに5系にアップデートするのですが Flyway5系からはマイグレーションを実行した情報を保存するテーブルが変わっています。
Flyway 3系, 4系では schema_versionというテーブルに保存されていたマイグレーションの情報が Flyway 5系では flyway_schema_historyというテーブルに変わっています。
そのため、以下のような設定をSpring Bootのapplication.propertiesにしてやる必要があります。 設定をしておきます。
flyway.table=schema_version # Spring Boot 2系では、spring.flyway.tableになります。
5.1.3にあげて起動してみます。
$ gradle bootRun ... 2018-06-29 20:13:15.055 INFO 62740 --- [ restartedMain] c.g.wreulicke.simple.SimpleApplication : Started SimpleApplication in 14.769 seconds (JVM running for 15.748)
というわけで、手元で試したところ、動きました。
まとめ
今回は Flywayのバージョンアップについて調べてまとめておきました。 皆さんのFlyway/Spring Bootのアップデートにお役に立てると嬉しいです。
また、今回はFlywayをアップデートせずにSpring Bootのバージョンアップだけをする、という方法を試しませんでした。 どなたか、試して記事にしてもらえると面白いかもしれません。
それでは、また別の記事でお会いしましょう。齋藤でした。
おまけで、いくつか試行錯誤したログを書いておきます。
これでアップデートの目処が立ってきましたよ!! 僕と一緒に Spring Bootを使ったアプリケーションのバージョンアップをやってみたい、という方は こちらから 待ってます!!!
おまけ なんとなく 3 --> 5 に移行しようとしてみた
ちなみに、最初はSpring Bootの設定をせずに Flywayを3系から5系になんとなく上げてみました。
$ gradle bootRun Caused by: org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration version 1 -> Applied to database : -1362686682 -> Resolved locally : -523004839 at org.flywaydb.core.Flyway.doValidate(Flyway.java:1037) ~[flyway-core-5.1.3.jar:na] at org.flywaydb.core.Flyway.access$100(Flyway.java:78) ~[flyway-core-5.1.3.jar:na] at org.flywaydb.core.Flyway$1.execute(Flyway.java:918) ~[flyway-core-5.1.3.jar:na] at org.flywaydb.core.Flyway$1.execute(Flyway.java:910) ~[flyway-core-5.1.3.jar:na] at org.flywaydb.core.Flyway.execute(Flyway.java:1238) ~[flyway-core-5.1.3.jar:na] at org.flywaydb.core.Flyway.migrate(Flyway.java:910) ~[flyway-core-5.1.3.jar:na] at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) ~[spring-boot-autoconfigure-1.5.10.RELEASE.jar:1.5.10.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE] ... 92 common frames omitted
ファイルは変えてないのにマイグレーションのチェックサムの差分が出てしまっています。 これは、Flywayのバージョンアップでチェックサムの計算方法が変わったのでしょうか? というわけでこんなエラーが出ましたよ、という話でした。
おまけ flyway.tableを指定しなかった時
flyway.tableを指定しなかった場合はどうなるんでしょうか。 答えはここです。
フォールバックの機能があるみたいなんですが、Flyway6系で削除されるようです。 ちゃんと自分で指定しておいたほうが良さそうですね。
2018-06-29 20:13:08.460 WARN 62740 --- [ost-startStop-1] o.f.c.i.s.JdbcTableSchemaHistory : Could not find schema history table `test`.`flyway_schema_history`, but found `test`.`schema_version` instead. You are seeing this message because Flyway changed its default for flyway.table in version 5.0.0 to flyway_schema_history and you are still relying on the old default (schema_version). Set flyway.table=schema_version in your configuration to fix this. This fallback mechanism will be removed in Flyway 6.0.0.